﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using Didsoft.SalesLive.Entidades;
using System.Collections.ObjectModel;
using Didsoft.Silverlight.ViewModel.Commanding.Contracts;
using Didsoft.Silverlight.ViewModel;
using System.Linq;
using System.Collections.Generic;
using System.ServiceModel.DomainServices.Client;


namespace Didsoft.SalesLive.UI.Views.ViewModel
{
    public class VmRegistroModal : ViewModelBase
    {
        #region propiedades bindables

        private Persona personaObj;
        public Persona PersonaObj
        {
            get { return personaObj; }
            set
            {
                personaObj = value;
                Notificar("PersonaObj");
                CmdEliminar.RaiseCanExecuteChanged();
            }
        }

        private ObservableCollection<string> generos;
        public ObservableCollection<string> Generos
        {
            get { return generos; }
            set
            {
                generos = value;
                Notificar("Generos");
            }
        }


        private IEnumerable<Persona> personas;
        public IEnumerable<Persona> Personas
        {
            get { return negocios.Personas; }
        }
        

        #endregion

        #region comandos

        #region CmdNuevo

        public ICommandEvent CmdNuevo { get; set; }
        public void CmdNuevo_Ejecutar(string param)
        {
            PersonaObj = new Persona();
            CmdGuardar.RaiseCanExecuteChanged();

        }
        public bool CmdNuevo_PuedeEjecutar(string param)
        {
            return true;
        }

        #endregion

        #region CmdGuardar

        public ICommandEvent CmdGuardar { get; set; }
        public void CmdGuardar_Ejecutar(string param)
        {
            

            if(PersonaObj.Id==0) negocios.Personas.Add(PersonaObj);
            Guardar();

            PersonaObj = null;
            CmdGuardar.RaiseCanExecuteChanged();

        }
        public bool CmdGuardar_PuedeEjecutar(string param)
        {
            return PersonaObj != null;
        }

        #endregion        

        #region CmdEliminar

        public ICommandEvent CmdEliminar { get; set; }
        public void CmdEliminar_Ejecutar(string param)
        {
            negocios.Personas.Remove(PersonaObj);
            Guardar();
        }
        public bool CmdEliminar_PuedeEjecutar(string param)
        {
            return PersonaObj!=null && negocios.Personas.Contains(PersonaObj);
        }

        #endregion

        #endregion

        #region Entity Framework Servidor Negocios

        private Negocios.PersonaNegocios negocios = new Negocios.PersonaNegocios();
        
        #endregion
        
        #region constructor

        public VmRegistroModal()
        {
            CargarGeneros();
            InicializarComandos();
            CargarPersonas();
        }       

        #endregion

        #region metodos

        private void CargarPersonas()
        {
            negocios.Load<Persona>(negocios.GetPersonasQuery(),
                                cargar =>
                                {
                                    if (cargar.HasError)
                                        cargar.MarkErrorAsHandled();
                                    else
                                        personas = cargar.Entities;
                                }, null);
        }

        private void InicializarComandos()
        {
            CmdNuevo = new DelegateCommand<string>(CmdNuevo_Ejecutar, CmdNuevo_PuedeEjecutar);
            CmdGuardar = new DelegateCommand<string>(CmdGuardar_Ejecutar, CmdGuardar_PuedeEjecutar);
            CmdEliminar = new DelegateCommand<string>(CmdEliminar_Ejecutar, CmdEliminar_PuedeEjecutar);
        }

        private void CargarGeneros()
        {
            Generos = new ObservableCollection<string>();
            Generos.Add("No Definido");
            Generos.Add("Femenino");
            Generos.Add("Masculino");

        }

        private void Guardar()
        {
            negocios.SubmitChanges(OnSubmitCompleted, null);        
        }

        private void OnSubmitCompleted(SubmitOperation so)
        {
            if (so.HasError)
            {
                MessageBox.Show(string.Format("Submit Failed: {0}", so.Error.Message));
                so.MarkErrorAsHandled();
            }
            //CheckChanges();
        }

        #endregion

    }


}
